package main

import "fmt"

/**
【1】结构体可以使用嵌套匿名结构体所有的字段和方法，即:首字母大写或者小写的字段、方法，都可以使用。
【2】匿名结构体字段访问可以简化。
【3】当结构体和匿名结构体有相同的字段或者方法时，编译器采用就近访间原则访问，如希望访问匿名结构体的字段和方法，可以通过匿名结构体名来区分。

【4]Golang中支持多继承:如一个结构体嵌套了多个匿名结构体，那么该结构体可以直接访问嵌套的匿名结构体的字段和方法，从而实现了多重继承。为了保证代码的简洁性，建议大家尽量不使用多重继承，很多语言就将多重继承去除了，但是Go中保留了,
【5】如嵌入的匿名结构体有相同的字段名或者方法名，则在访问时，需要通过匿名结构体类型名来区分
【6】结构体的匿名字段可以是基本数据类型。
【7】嵌套匿名结构体后，也可以在创建结构体变量(实例)时，直接指定各个匿名结构体字段的值。
【8】嵌入匿名结构体的指针也是可以的。
【9】结构体的字段可以是结构体类型的。(组合模式)
*/

type Animal struct {
	Age    int
	Weight int
}

// 喊叫的方法
func (a *Animal) Say() {
	fmt.Println("animal say")
}

func (a *Animal) test() {
	fmt.Println("animal test")
}

type Dog struct {
	Animal
}

func (d *Dog) Say() {
	fmt.Println("dog say")
}

func (d *Dog) show() {
	fmt.Println("dog show")
}

func main() {
	var dog Dog
	//dog.Animal.Say()
	// 如dog有say方法，那么可以直接调用，没有则向上调用Animal的Say方法
	dog.Say()
	dog.show()
	dog.test()
}
